import axios from 'axios';
import qs from 'qs';
import { CANCEL_REQUEST_MESSAGE } from 'utils/constant'

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

if (process.env.NODE_ENV == 'development') {
  axios.defaults.baseURL = '';
} else if (process.env.NODE_ENV == 'debug') {
  axios.defaults.baseURL = '';
} else if (process.env.NODE_ENV == 'production') {
  axios.defaults.baseURL = '';
}

// 1. 创建axios实例
const request = axios.create({
  timeout: 600000 // 请求超时时间
});

// 2. http request 拦截器
request.interceptors.request.use(config => {  

  // 指定资源的MIME类型，默认为：'application/json;charset=UTF-8'
  config.headers['Content-type'] = config.headers['Content-type'] ? config.headers['Content-type'] : 'application/json';
  config.data = config.headers['Content-type'] === 'application/x-www-form-urlencoded' ? qs.stringify(config.data) : config.data;
  // 其它配置项
  config.headers["X-Requested-With"] = "XMLHttpRequest";
  config.withCredentials = true;
  return config;
}, error => {
  return Promise.reject(error);
});

// 3. respone拦截器
request.interceptors.response.use(
  (response) => {
    const { statusText, status, data } = response
    let result = {}
    if (typeof data === 'object') {
      result = data
      // if (Array.isArray(data)) {
      //   result.list = data
      // }
    } else {
      result = data
    }

    return Promise.resolve({
      success: true,
      message: statusText,
      statusCode: status,
      ...result,
    })
  }, (error) => {
    const { response, message } = error
  
    if (String(message) === CANCEL_REQUEST_MESSAGE) {
      return {
        success: false,
      }
    }

    let msg
    let statusCode

    if (response && response instanceof Object) {
      const { data, statusText, status } = response
      const errorText = codeMessage[status] || statusText;
      statusCode = status
      msg = errorText || data.message || statusText
    } else {
      statusCode = 600
      msg = error.message || 'Network Error'
    }

    /* eslint-disable */
    return Promise.reject({
      success: false,
      statusCode,
      message: msg,
    })
  }
);

export default request;
